# 210cmake_function/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(cmake_function)

macro(mac1 arg1 arg2)
    message("IN macro mac1 arg1 = ${arg1} arg2 = ${arg2}")
    if(arg2)
        message("arg2 = TRUE")
    endif()
    # return()  # 调用后当前函数、目录、文件退出
endmacro()
mac1(OFF TRUE "testfunc1")

function(fun1 arg1 arg2)
    if(arg1)
        message("arg1 is true")
        return()
    endif()
    
    message("IN function fun1 arg1 = ${arg1} arg2 = ${arg2}")
    if(arg2)    # 函数区别于宏可以当作变量
        message("arg2 = TRUE")
    endif()
    foreach(var IN LISTS ARGN)  # 遍历所有变参
        message("var = ${var}")
    endforeach()
endfunction()
fun1(OFF TRUE "testfunc1" 1 3 ON)
# fun1(ON TRUE "testfunc1" 1 3 ON)

function(fun_var arg1)
    # arg1 参数变量如果有全局变量名字一样还是取局部的变量
    message("in fun_var ${arg1}")
    message("var1 = ${var1}")
    set(var1 "fun var")     # 不能修改外部变量 这一步调用相当于创建了一个局部变量
    set(RET "1" PARENT_SCOPE)   # 设定变量作用域到父（调用函数着、父目录）
endfunction()

set(var1 "main")
set(arg1 "main arg1")
fun_var(123)
message("var1 = ${var1}")
message("RET = ${RET}")

add_subdirectory(sub1)
# 可以直接访问子目录中的函数
func_sub1() # 父目录重新创建了一套内存空间
message("sub1_var = ${sub1_var}")

